(function (): void {
    // 定义一个类
    class Person {
        // public 公共属性
        // private 私有属性
        // protected 受包含的属性,只能在类或者子类中访问,不能在实例访问


        /*  ****** 可以直接将属性定义在构造函数中
             class C{
                // 可以直接将属性定义在构造函数中
                constructor(public num: number,public name: string){
                    this.num = num;
                    this.name = name;
                }
            }
        */


        // 定义属性
        private _name: string;
        private _age: number;

        // 构造函数
        constructor(name: string, age: number) {
            this._name = name;
            this._age = age;
        }

        // 定义只读属性
        public getName() {
            return this._name;
        }

        // 定义只读属性
        public getAge() {
            return this._age;
        }

        // set
        public setName(value: string) {
            if (value.length < 2 || value.length > 5) {
                throw new Error('名字长度必须介于2-5之间');
            }
            this._name = value;
        }

        public setAge(value: number) {
            if (value < 0 || value > 150) {
                throw new Error('年龄必须在0-150之间');
            }
            this._age = value;
        }

        // TS中设置getter和setter
        // 定义只读属性
        public get name() {
            return this._name;
        }

        // 定义只读属性
        public get age() {
            return this._age;
        }

    }

    class A {
        protected num: number;
        constructor(num: number) {
            this.num = num;
        }
    }

    class B extends A {
        constructor(num: number) {
            super(num);
            this.num = num;
        }
    }

    class C {
        // 可以直接将属性定义在构造函数中
        constructor(public num: number, public name: string) {
            this.num = num;
            this.name = name;
        }
    }


    // 创建一个Person对象
    const person = new Person('张三', 20);

    // 访问属性
    console.log(person.getName()); // 输出：张三
    console.log(person.getAge()); // 输出：20

    // 修改属性
    person.setName('李四');
    person.setAge(30);

    // 访问属性
    console.log(person.name); // 输出：李四
    console.log(person.age); // 输出：30
})()